From fdd5e9f61ee0c7c40bb99cb77bc5a35363ff003e Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sun, 13 Aug 2017 15:16:11 -0400 Subject: [PATCH] Redo emoji data slightly No longer store variation sequences explicitly. Instead, put a 0 in the sequence where the modifiers will be inserted. This is more compact, and it allows us to put variations directly into the recent section. Update the type of the recent-emoji setting to match these changes. --- gtk/emoji/convert-emoji.c | 36 +++-- gtk/emoji/emoji.data | Bin 53562 -> 36967 bytes gtk/gtkemojichooser.c | 138 ++++++++++-------- gtk/org.gtk.Settings.EmojiChooser.gschema.xml | 7 +- 4 files changed, 105 insertions(+), 76 deletions(-) diff --git a/gtk/emoji/convert-emoji.c b/gtk/emoji/convert-emoji.c index 1e1f171260..dd406a1319 100644 --- a/gtk/emoji/convert-emoji.c +++ b/gtk/emoji/convert-emoji.c @@ -40,7 +40,10 @@ parse_code (GVariantBuilder *b, g_error ("failed to parse code: %s\n", strv[j]); return FALSE; } - g_variant_builder_add (b, "u", u); + if (0x1f3fb <= u && u <= 0x1f3ff) + g_variant_builder_add (b, "u", 0); + else + g_variant_builder_add (b, "u", u); } return TRUE; @@ -106,25 +109,25 @@ main (int argc, char *argv[]) array = json_node_get_array (root); length = json_array_get_length (array); - g_variant_builder_init (&builder, G_VARIANT_TYPE ("a(ausaau)")); + g_variant_builder_init (&builder, G_VARIANT_TYPE ("a(aus)")); i = 0; while (i < length) { JsonNode *node = json_array_get_element (array, i); JsonObject *obj = json_node_get_object (node); - GVariantBuilder b1, b2; + GVariantBuilder b1; const char *name; - const char *code; + char *code; int j; gboolean skip; + gboolean has_variations; i++; g_variant_builder_init (&b1, G_VARIANT_TYPE ("au")); - g_variant_builder_init (&b2, G_VARIANT_TYPE ("aau")); name = json_object_get_string_member (obj, "name"); - code = json_object_get_string_member (obj, "code"); + code = g_strdup (json_object_get_string_member (obj, "code")); if (strcmp (name, "world map") == 0) continue; @@ -141,16 +144,13 @@ main (int argc, char *argv[]) if (skip) continue; - if (!parse_code (&b1, code)) - return 1; - + has_variations = FALSE; while (i < length) { JsonNode *node2 = json_array_get_element (array, i); JsonObject *obj2 = json_node_get_object (node2); const char *name2; const char *code2; - GVariantBuilder b22; name2 = json_object_get_string_member (obj2, "name"); code2 = json_object_get_string_member (obj2, "code"); @@ -158,15 +158,19 @@ main (int argc, char *argv[]) if (!strstr (name2, "skin tone") || !g_str_has_prefix (name2, name)) break; - g_variant_builder_init (&b22, G_VARIANT_TYPE ("au")); - if (!parse_code (&b22, code2)) - return 1; - - g_variant_builder_add (&b2, "au", &b22); + if (!has_variations) + { + has_variations = TRUE; + g_free (code); + code = g_strdup (code2); + } i++; } - g_variant_builder_add (&builder, "(ausaau)", &b1, name, &b2); + if (!parse_code (&b1, code)) + return 1; + + g_variant_builder_add (&builder, "(aus)", &b1, name); } v = g_variant_builder_end (&builder); diff --git a/gtk/emoji/emoji.data b/gtk/emoji/emoji.data index 61d1af0bd962bbc394394732d4c9ccd461f20afb..12db9d4c40215c74506cb6c0e90c65cf3ff9cb4e 100644 GIT binary patch literal 36967 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 LnGI)NeCGcH+Cy8o literal 53562 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 diff --git a/gtk/gtkemojichooser.c b/gtk/gtkemojichooser.c index 8e92097b56..78384b6d31 100644 --- a/gtk/gtkemojichooser.c +++ b/gtk/gtkemojichooser.c @@ -120,36 +120,55 @@ scroll_to_section (GtkButton *button, static void add_emoji (GtkWidget *box, gboolean prepend, - GVariantIter *iter, - GVariant *data); + GVariant *item, + gunichar modifier); #define MAX_RECENT (7*3) +static void +populate_recent_section (GtkEmojiChooser *chooser) +{ + GVariant *variant; + GVariant *item; + GVariantIter iter; + + variant = g_settings_get_value (chooser->settings, "recent-emoji"); + g_variant_iter_init (&iter, variant); + while ((item = g_variant_iter_next_value (&iter))) + { + GVariant *emoji_data; + gunichar modifier; + + emoji_data = g_variant_get_child_value (item, 0); + g_variant_get_child (item, 1, "u", &modifier); + add_emoji (chooser->recent.box, FALSE, emoji_data, modifier); + g_variant_unref (emoji_data); + g_variant_unref (item); + } + g_variant_unref (variant); +} + static void add_recent_item (GtkEmojiChooser *chooser, - GVariant *item) + GVariant *item, + gunichar modifier) { GList *children, *l; - GVariantIter *codes; - const char *name; int i; GVariantBuilder builder; g_variant_ref (item); - g_variant_builder_init (&builder, G_VARIANT_TYPE ("a(ausaau)")); - g_variant_builder_add_value (&builder, item); - - g_variant_get_child (item, 1, "&s", &name); + g_variant_builder_init (&builder, G_VARIANT_TYPE ("a((aus)u)")); + g_variant_builder_add (&builder, "(@(aus)u)", item, modifier); children = gtk_container_get_children (GTK_CONTAINER (chooser->recent.box)); for (l = children, i = 1; l; l = l->next, i++) { GVariant *item2 = g_object_get_data (G_OBJECT (l->data), "emoji-data"); - const char *name2; + gunichar modifier2 = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (l->data), "modifier")); - g_variant_get_child (item2, 1, "&s", &name2); - if (strcmp (name, name2) == 0) + if (modifier == modifier2 && g_variant_equal (item, item2)) { gtk_widget_destroy (GTK_WIDGET (l->data)); i--; @@ -161,13 +180,11 @@ add_recent_item (GtkEmojiChooser *chooser, continue; } - g_variant_builder_add_value (&builder, item2); + g_variant_builder_add (&builder, "(@(aus)u)", item2, modifier2); } g_list_free (children); - g_variant_get_child (item, 0, "au", &codes); - add_emoji (chooser->recent.box, TRUE, codes, item); - g_variant_iter_free (codes); + add_emoji (chooser->recent.box, TRUE, item, modifier); g_settings_set_value (chooser->settings, "recent-emoji", g_variant_builder_end (&builder)); @@ -183,6 +200,7 @@ emoji_activated (GtkFlowBox *box, char *text; GtkWidget *label; GVariant *item; + gunichar modifier; gtk_popover_popdown (GTK_POPOVER (chooser)); @@ -190,7 +208,8 @@ emoji_activated (GtkFlowBox *box, text = g_strdup (gtk_label_get_label (GTK_LABEL (label))); item = (GVariant*) g_object_get_data (G_OBJECT (child), "emoji-data"); - add_recent_item (chooser, item); + modifier = (gunichar) GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (child), "modifier")); + add_recent_item (chooser, item, modifier); g_signal_emit (data, signals[EMOJI_PICKED], 0, text); g_free (text); @@ -208,8 +227,10 @@ long_pressed_cb (GtkGesture *gesture, GtkWidget *box; GVariant *emoji_data; GtkWidget *parent_popover; - GVariantIter *iter; - GVariantIter *codes; + GVariant *codes; + int i; + gboolean has_variations; + gunichar modifier; box = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (gesture)); child = GTK_WIDGET (gtk_flow_box_get_child_at_pos (GTK_FLOW_BOX (box), x, y)); @@ -220,12 +241,21 @@ long_pressed_cb (GtkGesture *gesture, if (!emoji_data) return; - g_variant_get_child (emoji_data, 2, "aau", &iter); - if (g_variant_iter_n_children (iter) == 0) + has_variations = FALSE; + codes = g_variant_get_child_value (emoji_data, 0); + for (i = 0; i < g_variant_n_children (codes); i++) { - g_variant_iter_free (iter); - return; + gunichar code; + g_variant_get_child (codes, i, "u", &code); + if (code == 0) + { + has_variations = TRUE; + break; + } } + g_variant_unref (codes); + if (!has_variations) + return; parent_popover = gtk_widget_get_ancestor (child, GTK_TYPE_POPOVER); popover = gtk_popover_new (child); @@ -242,13 +272,11 @@ long_pressed_cb (GtkGesture *gesture, g_signal_connect (box, "child-activated", G_CALLBACK (emoji_activated), parent_popover); - g_variant_get_child (emoji_data, 0, "au", &codes); - add_emoji (box, FALSE, codes, emoji_data); - g_variant_iter_free (codes); - while (g_variant_iter_next (iter, "au", &codes)) + add_emoji (box, FALSE, emoji_data, 0); + for (modifier = 0x1f3fb; modifier <= 0x1f3ff; modifier++) { - add_emoji (box, FALSE, codes, emoji_data); - g_variant_iter_free (codes); + add_emoji (box, FALSE, emoji_data, modifier); + g_variant_unref (codes); } gtk_popover_popup (GTK_POPOVER (popover)); @@ -257,19 +285,29 @@ long_pressed_cb (GtkGesture *gesture, static void add_emoji (GtkWidget *box, gboolean prepend, - GVariantIter *iter, - GVariant *data) + GVariant *item, + gunichar modifier) { GtkWidget *child; GtkWidget *label; PangoAttrList *attrs; + GVariant *codes; char text[64]; char *p = text; - gunichar code; + int i; - while (g_variant_iter_next (iter, "u", &code)) - p += g_unichar_to_utf8 (code, p); - p[0] = 0; + codes = g_variant_get_child_value (item, 0); + for (i = 0; i < g_variant_n_children (codes); i++) + { + gunichar code; + + g_variant_get_child (codes, i, "u", &code); + if (code == 0) + code = modifier; + if (code != 0) + p += g_unichar_to_utf8 (code, p); + } + p[0] = 0; label = gtk_label_new (text); attrs = pango_attr_list_new (); @@ -280,8 +318,10 @@ add_emoji (GtkWidget *box, child = gtk_flow_box_child_new (); gtk_style_context_add_class (gtk_widget_get_style_context (child), "emoji"); g_object_set_data_full (G_OBJECT (child), "emoji-data", - g_variant_ref (data), + g_variant_ref (item), (GDestroyNotify)g_variant_unref); + if (modifier != 0) + g_object_set_data (G_OBJECT (child), "modifier", GUINT_TO_POINTER (modifier)); gtk_container_add (GTK_CONTAINER (child), label); gtk_flow_box_insert (GTK_FLOW_BOX (box), child, prepend ? 0 : -1); @@ -296,16 +336,14 @@ populate_emoji_chooser (GtkEmojiChooser *chooser) GtkWidget *box; bytes = g_resources_lookup_data ("/org/gtk/libgtk/emoji/emoji.data", 0, NULL); - chooser->data = g_variant_ref_sink (g_variant_new_from_bytes (G_VARIANT_TYPE ("a(ausaau)"), bytes, TRUE)); + chooser->data = g_variant_ref_sink (g_variant_new_from_bytes (G_VARIANT_TYPE ("a(aus)"), bytes, TRUE)); g_variant_iter_init (&iter, chooser->data); box = chooser->people.box; while ((item = g_variant_iter_next_value (&iter))) { - GVariantIter *codes; const char *name; - g_variant_get_child (item, 0, "au", &codes); g_variant_get_child (item, 1, "&s", &name); if (strcmp (name, chooser->body.first) == 0) @@ -325,8 +363,7 @@ populate_emoji_chooser (GtkEmojiChooser *chooser) else if (strcmp (name, chooser->flags.first) == 0) box = chooser->flags.box; - add_emoji (box, FALSE, codes, item); - g_variant_iter_free (codes); + add_emoji (box, FALSE, item, 0); } } @@ -476,9 +513,8 @@ static void gtk_emoji_chooser_init (GtkEmojiChooser *chooser) { GtkAdjustment *adj; - GVariant *variant; - GVariantIter iter; - GVariant *item; + + chooser->settings = g_settings_new ("org.gtk.Settings.EmojiChooser"); gtk_widget_init_template (GTK_WIDGET (chooser)); @@ -506,19 +542,7 @@ gtk_emoji_chooser_init (GtkEmojiChooser *chooser) setup_section (chooser, &chooser->flags, "chequered flag", 0x1f3f4); populate_emoji_chooser (chooser); - - chooser->settings = g_settings_new ("org.gtk.Settings.EmojiChooser"); - variant = g_settings_get_value (chooser->settings, "recent-emoji"); - g_variant_iter_init (&iter, variant); - while ((item = g_variant_iter_next_value (&iter))) - { - GVariantIter *codes; - - g_variant_get_child (item, 0, "au", &codes); - add_emoji (chooser->recent.box, FALSE, codes, item); - g_variant_iter_free (codes); - } - g_variant_unref (variant); + populate_recent_section (chooser); } static void diff --git a/gtk/org.gtk.Settings.EmojiChooser.gschema.xml b/gtk/org.gtk.Settings.EmojiChooser.gschema.xml index d72027566d..7105cb200a 100644 --- a/gtk/org.gtk.Settings.EmojiChooser.gschema.xml +++ b/gtk/org.gtk.Settings.EmojiChooser.gschema.xml @@ -2,13 +2,14 @@ - + [] Recently used Emoji An array of Emoji definitions to show in the Emoji chooser. Each Emoji is - specified as an array of codepoints, a name, and an optional array of - nested Emoji. + specified as an array of codepoints and a name. The extra integer after this + pair is the code of the Fitzpatrick modifier to use in place of a 0 in the + codepoint array. -- 2.30.2